package leetcode每日一题.leetcode20213;


import java.util.ArrayDeque;

/**
 * 1. 问题描述
 *
 * 2. 算法分析
 *
 * 3. 代码实现
 */
@SuppressWarnings("all")
public class Q005_1_用队列实现栈 {
    class MyStack {

        ArrayDeque<Integer> mainDeque; // 入队
        ArrayDeque<Integer> tempDeque; // 临时
        int top; // 记录栈顶元素

        /** Initialize your data structure here. */
        public MyStack() {
            mainDeque = new ArrayDeque<>();
            tempDeque = new ArrayDeque<>();
        }

    /*
        注意：题目要求是我们只能使用队列的四个api，分别为队尾添加，对头查看/删除元素，当前长度，是否为操作
    */

        /** Push element x onto stack. */
        public void push(int x) {
            tempDeque.offer(x); // 将新元素先存放到临时变量中
            top = x; // 每次新入队的元素就是当前栈顶元素
            while(!mainDeque.isEmpty()) { // 如果主队队列不空，依次出队，将出队的元素入临时队列中
                tempDeque.offer(mainDeque.poll());
            }
            ArrayDeque<Integer> temp = new ArrayDeque<>();
            mainDeque = tempDeque;
            tempDeque = temp;
        }

        /** Removes the element on top of the stack and returns that element. */
        public int pop() {
            int temp = top;
            if(!mainDeque.isEmpty()) {
                mainDeque.poll(); // 实际删除
                if(!mainDeque.isEmpty()) {
                    top = mainDeque.peek();  // 更新栈顶
                }
            }
            return temp;
        }

        /** Get the top element. */
        public int top() {
            return top;
        }

        /** Returns whether the stack is empty. */
        public boolean empty() {
            return mainDeque.isEmpty();
        }
    }
}
